PowerShell DSCを使ってみた
西澤です。 Chefでも使われているというPowerShell Desired State Configuration(DSC)について調べてみたところ、AWS公式ブログでもドキュメントが公開されていました。試したことが無かったので、早速AWS環境で検証してみることにしました。
DSC環境
環境はWindows Server 2012 R2を利用しました。DSCではプッシュ/プルのいずれの構成も可能とのことなのですが、今回はプッシュ型の環境とする為、DSCクライアントへのWinRM許可(OSのFirewall、EC2のSecurity Group含む)が必要でした。
- AMI: Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2015.07.15
- Firewall: DSCサーバからDSCクライアントへの5985/tcpを許可
DSCの利用準備
Windows Server 2012 R2、Windows 8.1からであれば、標準で利用できるので、今回は追加作業は不要でした。Windows 7、Windows Server 2008 R2、Windows Server 2012では、Windows Management Framework 4.0を導入することで利用可能です。
PS C:\dsc> $PSVersionTable Name Value ---- ----- PSVersion 4.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.34209 BuildVersion 6.3.9600.17400 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSRemotingProtocolVersion 2.2 PS C:\dsc> Get-DscLocalConfigurationManager ActionAfterReboot : ContinueConfiguration AllowModuleOverwrite : False CertificateID : ConfigurationID : ConfigurationMode : ApplyAndMonitor ConfigurationModeFrequencyMins : 15 Credential : DebugMode : {NONE} DownloadManagerCustomData : DownloadManagerName : LCMCompatibleVersions : {1.0} LCMState : Idle LCMVersion : 1.0 RebootNodeIfNeeded : False RefreshFrequencyMins : 30 RefreshMode : PUSH PSComputerName :
Configurationの記述
DSCサーバ側に宣言的構文でConfigurationを記述します。Configurationは以下のブロックで構成されます。
- Configuration: 任意のConfiguration名
- Node: 反映対象ノード
- Resource: 処理内容
カスタムResourceを作成することも可能なようですが、今回はBuilt-In Windows PowerShell Desired State Configuration Resourcesのみを利用して構成します。設定内容は何となく読み取れるのではないかと思います。
PS C:\dsc> Configuration IISSetup { Node dsc-client { WindowsFeature FeatureAdd { Ensure = "Present" Name = "Web-Server" } Service ServiceStart { Name = "W3SVC" StartupType = "Manual" State = "Running" } File FilePut { Ensure = "Present" Type = "File" Contents = "<html><head><title>タイトル</title></head><body>こんにちは!</body></html>" DestinationPath = "C:\inetpub\wwwroot\index.html" } } }
MOF作成
続けて指定したConfiguration(コンパイルのような処理)を実行すると、MOFファイルが作成されます。オプション指定をしないと、カレントディレクトリ配下にConfiguration名のフォルダが作成され、その配下にファイルが生成されます。これで配布準備が完了です。
PS C:\dsc> IISSetup ディレクトリ: C:\dsc\IISSetup Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2015/08/10 17:58 2446 dsc-client.mof
CIMセッション接続
DSCクライアントに対して、CIMセッションから接続します。AWSで用意されているWindows AMIではデフォルトで有効となっているので、Enable-PSRemotingは不要なはずです。どちらもWinRM利用となりますが、PowerShell v3以降では、PSSessionよりもCIMSessionが推奨されているようです。後で実行するStart-DscConfigurationの際に、Credentialを渡すことも可能ですが、Firewallが正しく解放されていること、認証情報が正しいこと等を切り分けることができるよう、ここで接続しておいた方が確実です。
PS C:\dsc> New-CimSession -ComputerName dsc-client -Credential $(Get-Credential) コマンド パイプライン位置 1 のコマンドレット Get-Credential 次のパラメーターに値を指定してください: Credential Id : 1 Name : CimSession1 InstanceId : db2bd94e-c2f9-4f8d-8e18-890d54d8102e ComputerName : dsc-client Protocol : WSMAN PS C:\dsc> $cimsession = $(Get-CimSession)
DSCクライアントへのPush
生成したMOFファイルと接続したCIMセッションを利用して、設定した内容をPushします。Configurationが適用されていく様子が表示されています。
PS C:\dsc> Start-DscConfiguration -Wait -Verbose -Path .\IISSetup -CimSession $cimsession 詳細: パラメーター ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration' を使用して操作 'CimMethod の呼び出し' を実行します。 詳細: コンピューター WIN-DFQF61T82AD、ユーザー SID S-1-5-21-3376612907-2284739138-3425852451-1001 から LCM メソッドが呼び出されました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature' が開始されました: Web-Server 詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature' は成功しました: Web-Server 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[WindowsFeature]FeatureAdd] 0.3120 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ スキップ 設定 ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[Service]ServiceStart] 0.0160 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC' が開始されました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[Service]ServiceStart] 0.4060 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 指定されたファイルが見つかりません。 詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 関連するファイル/ディレクトリは C:\inetpub\wwwroot\index.html です。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[File]FilePut] 0.0310 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 指定されたファイルが見つかりません。 詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 関連するファイル/ディレクトリは C:\inetpub\wwwroot\index.html です。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[File]FilePut] 0.0000 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] (0.9142 秒)。 詳細: 操作 'CimMethod の呼び出し' が完了しました。 詳細: 構成ジョブが完了するまでにかかった時間は 2.362 秒です
冪等性確認とConfiguration更新
Configurationを更新して、再度Pushしてみましょう。サービスの起動設定とhtmlファイルだけ書き換えてみました。
PS C:\dsc> Configuration IISSetup >> { >> Node dsc-client >> { >> WindowsFeature FeatureAdd >> { >> Ensure = "Present" >> Name = "Web-Server" >> } >> >> Service ServiceStart >> { >> Name = "W3SVC" >> StartupType = "Automatic" >> State = "Running" >> } >> >> File FilePut >> { >> Ensure = "Present" >> Type = "File" >> Contents = "<html><head><title>タイトル</title></head><body>こんにちは!さようなら!</body></html>" >> DestinationPath = "C:\inetpub\wwwroot\index.html" >> } >> } >> } >> PS C:\dsc> IISSetup ディレクトリ: C:\dsc\IISSetup Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2015/08/10 18:37 2464 dsc-client.mof PS C:\dsc> Start-DscConfiguration -Wait -Verbose -Path .\IISSetup -CimSession $cimsession 詳細: パラメーター ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration' を使用して操作 'CimMethod の呼び出し' を実行します。 詳細: コンピューター WIN-DFQF61T82AD、ユーザー SID S-1-5-21-3376612907-2284739138-3425852451-1001 から LCM メソッドが呼び出されました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature' が開始されました: Web-Server 詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature' は成功しました: Web-Server 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[WindowsFeature]FeatureAdd] 0.2660 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ スキップ 設定 ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[WindowsFeature]FeatureAdd] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC' の開始の種類は 'Manual' です。'Automatic' と一致しません。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[Service]ServiceStart] 0.0310 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC' は既に開始されています。操作は必要ありません。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[Service]ServiceStart] 0.0630 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[Service]ServiceStart] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[File]FilePut] 0.0000 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[File]FilePut] 0.0000 秒かかりました。 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[File]FilePut] 詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] (0.4606 秒)。 詳細: 操作 'CimMethod の呼び出し' が完了しました。 詳細: 構成ジョブが完了するまでにかかった時間は 2.195 秒です
変更があった箇所だけ更新されていますね。
まとめ
DSCはChefやpuppetのWindows版のようなものだろうと考えていたのですが、Windowsに限らずもっと大きな枠組みを目指して設計されているものだそうです。PowerShell v5ではさらに機能拡張される予定とのことですので、今後にも期待したいですね。